import rclpy #导入ros的客户端库，必备步骤
from rclpy.node import Node #rclpy.node是ros客户端库自带的Node类，用于创建节点
from std_msgs.msg import UInt32

class PlayerNode(Node):  #采用面向对象(OOP)的方式建立node； 定义了一个PlayerNode的类，继承rclpy.node中的Node；
    def __init__(self,name):  #定义初始化方法；或者叫构造函数。。(构造函数是个人的理解，源自C++)
        super().__init__(name) #调用父类初始化，需要传入参数name，通常name是实例化的Node的名称，即节点名字；比如本例子中节点名字是 God
        self.get_logger().info("PlayerNode初始化成功！")  #get_logger().info是rclpy.node中的方法；
        #在这里意思是，当这个PlayerNode节点实例化的时候，输出一句日志；
        self.getDiceNum=self.create_subscription(UInt32,"diceGame",self.getDiceNum_callback,10)
        
    def getDiceNum_callback(self,diceNum): #订阅者 收到消息后的回调函数 
        self.get_logger().info("掷骰子游戏开始!数字是：%d" % diceNum.data) #将收到的骰子数值显示出来
        
def main(args=None):  #main函数，程序执行的主入口
    rclpy.init(args=args)  # 初始化客户端库，必备步骤
    node=PlayerNode("player")  # 新建节点对象，必备步骤；传入player，将playerNode实例化
    rclpy.spin(node)   # spin循环节点,保持节点运行，检测是否收到退出指令（Ctrl+C），必备步骤
    rclpy.shutdown()  # 关闭客户端库，必备步骤